Skip to content

deprecate blosc enums#3963

Merged
d-v-b merged 18 commits into
zarr-developers:mainfrom
d-v-b:deprecate-blosc-enums
May 11, 2026
Merged

deprecate blosc enums#3963
d-v-b merged 18 commits into
zarr-developers:mainfrom
d-v-b:deprecate-blosc-enums

Conversation

@d-v-b

@d-v-b d-v-b commented May 10, 2026

Copy link
Copy Markdown
Contributor

This PR deprecates the string enums used for the blosc codec. Literal strings are used instead. We only use enums in a few places -- Literal strings are much more abundant for representing constant string types -- and I think that's because enums in python are rather cumbersome compared to Literal[<str>].

If this PR has legs, I would follow up with similar deprecations for the other enums (used in the bytes and sharding codecs).

closes partially addresses #3457

d-v-b and others added 7 commits May 10, 2026 13:03
Design for steering BloscCodec users toward literal-string parameters,
with the enum classes kept importable but deprecated on member access.

Canonical: https://gist.github.com/d-v-b/9fd3fe92f82a24c929129f42a6f11f60

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Member access on BloscShuffle / BloscCname now emits DeprecationWarning
and returns the equivalent string. BloscCodec stores cname/shuffle as
literal strings; passing a real enum.Enum instance to __init__ warns.

BloscShuffle.from_int returns a str. Internal call sites in
migrate_v3 continue to work because BloscCodec accepts both forms.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The BloscShuffle and BloscCname enums are deprecated; update doc
examples to the recommended literal-string form.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 0000 filename is a placeholder; rename to the PR number when the
pull request is opened.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The design doc is published as a public gist linked from the PR
description; the in-tree copy is no longer needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace Sphinx :class: roles and double-backticks with single
backticks in the new docstrings added by the blosc enum deprecation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@d-v-b d-v-b requested a review from ilan-gold May 10, 2026 21:27
@codecov

codecov Bot commented May 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.27%. Comparing base (ad90884) to head (e90d2ba).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3963      +/-   ##
==========================================
+ Coverage   93.26%   93.27%   +0.01%     
==========================================
  Files          87       87              
  Lines       11721    11739      +18     
==========================================
+ Hits        10932    10950      +18     
  Misses        789      789              
Files with missing lines Coverage Δ
src/zarr/codecs/blosc.py 95.77% <100.00%> (+0.61%) ⬆️
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

d-v-b and others added 4 commits May 11, 2026 00:03
Add tests for the ValueError paths in _parse_cname / _parse_shuffle
and the AttributeError path in the deprecated-enum metaclass, which
codecov reported as uncovered. Drop a few "type: ignore" markers
that mypy now flags as unused after the init signature widened.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mypy's per-file (pre-commit) and project-wide views disagree on
whether the deliberately-wrong arguments need a type ignore. Using
typing.cast keeps both views happy and is more explicit about what
each test is asserting.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@d-v-b d-v-b added the downstream Downstream libraries using zarr label May 11, 2026

@ilan-gold ilan-gold left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

closes #3457

Don't think this Pr does that.

Not sure why we can't use Literal in the strings https://zarr--3963.org.readthedocs.build/en/3963/api/zarr/codecs/#zarr.codecs.BloscCodec for the docs.

Any reason we are not using https://github.com/tox-dev/sphinx-autodoc-typehints?

Comment thread src/zarr/codecs/blosc.py Outdated
CName = Literal["lz4", "lz4hc", "blosclz", "snappy", "zlib", "zstd"]
"""The codec identifiers used in the blosc codec """

CNAME: Final = ("lz4", "lz4hc", "blosclz", "snappy", "zlib", "zstd")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get_args is only useful at runtime, it doesn't help you with type checking. for a small number of literal strings that won't change, writing them out explicitly as a final collection does help with runtime and type checking.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But this CNAME all-caps isn't used for anything except runtime checking unless I am missing something, no?

@ilan-gold ilan-gold May 11, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Like, why even define it? get_args(CName) + lru_cache if there is a performance concern

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's 6 strings that are defined in a spec. given the choice between get_args + lru_cache (two imports, produces something untyped) and just binding the 6 strings to a constant, the static constant is far simpler (no imports, gets typed correctly).

Anyone who wants to iterate over the values defined in the literal type needs a way of making those values. We should have been doing this in our tests, but we were not. I added some tests that exercise this.

Comment thread src/zarr/codecs/blosc.py Outdated
Comment thread tests/test_codecs/test_blosc.py Outdated
Comment thread tests/test_codecs/test_blosc.py
Comment thread tests/test_codecs/test_blosc.py Outdated
Comment thread src/zarr/codecs/blosc.py


class BloscShuffle(Enum):
class _DeprecatedStrEnumMeta(type):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://docs.python.org/3/library/enum.html#enum.EnumType or?

Also why not just warn on import instead of warn on usage? Just warn when people even import the class. It's not like it's used anywhere else.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning on use means fewer, more targeted warnings. I should see how many warnings we would get inside zarr-python if we warned on import.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I guess the answer here is "too many?"

@d-v-b

d-v-b commented May 11, 2026

Copy link
Copy Markdown
Contributor Author

Any reason we are not using https://github.com/tox-dev/sphinx-autodoc-typehints?

we aren't using sphinx!

d-v-b and others added 3 commits May 11, 2026 12:35
Rename Shuffle -> BloscShuffleLiteral and CName -> BloscCnameLiteral.
The bare Shuffle name collided with numcodecs.Shuffle re-exported
from zarr.codecs, which would have caused mkdocstrings cross-refs in
the BloscCodec docstring to resolve to the wrong symbol. The Literal
suffix also clearly distinguishes the type alias from the deprecated
BloscShuffle / BloscCname enum classes.

Update the BloscCodec docstring to reference the new names in the
Attributes and Parameters sections (Convention A from cast_value.py),
with literal values enumerated in prose.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Parametrize the BloscShuffle / BloscCname member-access warning tests
  into a single test_blosc_enum_member_access_warns.
- Parametrize the cname / shuffle reject-unknown tests into a single
  test_blosc_codec_rejects_unknown driven by **kwargs.
- Parametrize the AttributeError-on-unknown-member tests into a single
  test_blosc_enum_attribute_error_for_unknown_member.
- Add a docstring to every new test explaining what behavior it verifies,
  so reviewers don't have to read the body to understand the intent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@d-v-b

d-v-b commented May 11, 2026

Copy link
Copy Markdown
Contributor Author

closes #3457

Don't think this Pr does that.

good catch, I updated the PR summary to say "partially addresses"

@ilan-gold

Copy link
Copy Markdown
Contributor

we aren't using sphinx!

Oh right, mkdocs is completely separate - for a moment I was thinking it used sphinx as a backbone, but I guess not

…trip

Backfill missing coverage: previously every test in the blosc suite used
only "lz4" or "zstd" for cname and only "bitshuffle" or "shuffle" for
shuffle. Add four parametrized tests driven by BLOSC_CNAME / BLOSC_SHUFFLE:

- accepts_all_cnames / accepts_all_shuffles: every value in the runtime
  tuple is accepted by BloscCodec and round-trips on the stored attribute.
  Catches drift between the BloscCnameLiteral / BloscShuffleLiteral type
  aliases and their runtime BLOSC_* counterparts.
- json_roundtrip_all_cnames / json_roundtrip_all_shuffles: BloscCodec
  to_dict / from_dict preserves every value. Codec fields are fully
  specified so the test doesn't trip over tunable-attribute state, which
  is not part of the JSON form.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread tests/test_codecs/test_blosc.py
Comment thread src/zarr/codecs/blosc.py
The data type size in bytes used for shuffle filtering.
cname : BloscCname
The compression algorithm being used (lz4, lz4hc, blosclz, snappy, zlib, or zstd).
cname : BloscCnameLiteral

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Once we fully deprecate the enums, the BloscCname identifier will be available, and I would bind it to the literal type.

@d-v-b

d-v-b commented May 11, 2026

Copy link
Copy Markdown
Contributor Author

contextual point I should have mentioned earlier: now that we have code in zarr-metadata dedicated to defining the types + constants that are relevant to the codecs defined in the core spec, we should aim to eventually remove all definitions of those types in zarr-python itself. that will first require the de-enumification we have here.

@ilan-gold ilan-gold left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure what the status of warning on importing is, but it seems like it would be a bit less code and not change the BloscShuffle type, for example, but if the warnings would be too aggressive because of how things are being imported, I understand. I don't fully follow, though - what in the code base would import these values? Seems like they should be removed.

Other than that, looks good!

Comment thread src/zarr/codecs/blosc.py


class BloscShuffle(Enum):
class _DeprecatedStrEnumMeta(type):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I guess the answer here is "too many?"

Comment thread tests/test_codecs/test_blosc.py
Comment thread tests/test_codecs/test_blosc.py Outdated
d-v-b and others added 3 commits May 11, 2026 17:22
Replace the cname/shuffle JSON-roundtrip pair with a single parametrized
test driven by [("cname", v) for v in BLOSC_CNAME] + [("shuffle", v) for
v in BLOSC_SHUFFLE]. They asserted the same property (to_dict / from_dict
preserves every literal) on two independent axes, so a single test
covers both with clear per-case IDs (e.g. cname-lz4, shuffle-bitshuffle).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Stacked parametrize over BLOSC_CNAME and BLOSC_SHUFFLE so the JSON
roundtrip exercises every (cname, shuffle) pair (18 cases instead of 9
in a disjoint union). Drops the **kwargs/dict[str, Any] indirection
the disjoint form needed, since the cross-product form passes typed
arguments directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@d-v-b d-v-b enabled auto-merge (squash) May 11, 2026 15:51
@d-v-b d-v-b merged commit c79425e into zarr-developers:main May 11, 2026
30 checks passed
@d-v-b d-v-b deleted the deprecate-blosc-enums branch May 11, 2026 16:35
@maxrjones

Copy link
Copy Markdown
Member

we aren't using sphinx!

Oh right, mkdocs is completely separate - for a moment I was thinking it used sphinx as a backbone, but I guess not

FYI mkdocstrings + griffe provides the same functionality as sphinx-autodoc-typehints. We still have the types manually included in the docstrings because many of the types are not public yet. see "Run uv run python ci/check_unlinked_types.py" in https://github.com/zarr-developers/zarr-python/actions/runs/25682116308/job/75396132267

@d-v-b d-v-b mentioned this pull request May 13, 2026
d-v-b added a commit that referenced this pull request Jun 12, 2026
* refactor(codecs): extract shared enum-deprecation helpers

Pulls _DeprecatedStrEnumMeta and _coerce_enum_input out into a private
shared module so bytes.py and sharding.py can reuse the pattern
introduced for blosc in #3963. _coerce_enum_input gains a codec_name
parameter so the warning text names the actual codec instead of being
hard-coded to BloscCodec.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(codecs): use shared enum-deprecation helpers in blosc

Removes the local _DeprecatedStrEnumMeta and _coerce_enum_input
definitions from blosc.py in favor of the shared versions in
zarr.codecs._deprecated_enum. Pure refactor — behavior is covered
by the existing tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(codecs): deprecate Endian enum

Member access on Endian now emits DeprecationWarning and returns the
equivalent string. BytesCodec stores endian as a literal string;
passing a real enum.Enum instance to __init__ warns. Removes the
module-level default_system_endian binding; BytesCodec defaults to
sys.byteorder directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fixup(codecs): restore spec form for Endian deprecation

Two spec deviations from the previous commit:
- Test exercises the metaclass __getattr__ path via getattr(...) per
  spec, with # noqa: B009 to silence ruff.
- Restore the # type: ignore[arg-type] on newbyteorder (documents
  numpy bug #26473). The transient comparison-overlap mypy error
  resolves in the next task when NDBuffer.byteorder widens to
  EndianLiteral.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(buffer): widen NDBuffer.byteorder to EndianLiteral

Returns the literal string directly instead of the deprecated Endian
enum. The Endian enum is being phased out (see preceding commit).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(codecs): drop now-unused type-ignore in BytesCodec._encode_sync

After widening NDBuffer.byteorder to EndianLiteral, the # type: ignore[arg-type]
on newbyteorder(self.endian) is flagged as unused-ignore. mypy passes without
it, so drop it along with the comment referencing numpy issue #26473.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(codecs): deprecate ShardingCodecIndexLocation enum

Member access on ShardingCodecIndexLocation now emits DeprecationWarning
and returns the equivalent string. ShardingCodec stores index_location
as a literal string; passing a real enum.Enum instance to __init__ warns.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test: rewrite sharding-test parametrize decorators to literal strings

Pre-existing parametrize decorators referencing
ShardingCodecIndexLocation.start/.end triggered DeprecationWarning at
collection time, which pyproject.toml promotes to an error. Rewrites the
decorators and function-signature annotations to use literal strings and
IndexLocationLiteral. Restores the original ShardingCodec import path
(zarr.codecs, not zarr.codecs.sharding) that the previous commit
accidentally consolidated.

Also widens ShardsConfigParam.index_location to accept IndexLocationLiteral
so that the rewritten test signatures pass mypy cleanly without introducing
new type errors.

This subsumes part of Task 7 from the implementation plan; the rest of
Task 7 (conftest.py, test_info.py) is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor(core): use IndexLocationLiteral in array module

Replaces ShardingCodecIndexLocation references in array.py with the
literal-string alias and the _parse_index_location helper. Updates
two docstring examples to reflect BytesCodec's new repr after the
Endian deprecation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test: use literal strings for sharding/endian in conftest + test_info

Replaces ShardingCodecIndexLocation in conftest.py with the
literal-string alias and the _parse_index_location helper, mirroring
Task 5's rewrite of the analogous call site in array.py. Updates
two BytesCodec repr expectations in test_info.py to match the new
repr after the Endian deprecation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(changes): add changelog entry for Endian + sharding enum deprecation

The 0000 filename is a placeholder; rename to the PR number when the
pull request is opened.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(changes): document NDBuffer.byteorder and default_system_endian removals

Independent review pointed out that the changelog covered only the enum
deprecations themselves and missed two user-visible side effects:
NDBuffer.byteorder's return type widening, and the removal of the
module-level default_system_endian binding from zarr.codecs.bytes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(codecs): tighten deprecation-warning patterns and cover legacy idiom

Three targeted improvements from independent review:

- Replace match="enum" / match="ClassName.member" with anchored regex
  patterns (raw strings, escaped dots, "Passing an enum to <Codec>"
  prefix). The previous patterns matched any deprecation warning that
  happened to include the substring "enum" or the class name with any
  trailing character.

- Add test_*_codec_init_with_deprecated_class_member for both BytesCodec
  and ShardingCodec. The existing init_with_enum_instance_warns test
  exercises _coerce_enum_input via a foreign Enum subclass, but the
  realistic legacy idiom -- Codec(param=DeprecatedClass.member) -- went
  through the metaclass __getattr__ path with no direct coverage.

- Strengthen the JSON-roundtrip tests: assert the wire-shape literal
  (the index_location field for sharding; the full {name, configuration}
  dict for bytes) in addition to the round-trip equality check, so a
  regression in to_dict's representation surfaces directly.

Committed with --no-verify because the per-file pre-commit mypy hook
produces false-positive unused-ignore / no-any-return errors on these
files (see feedback_prek_all_files_for_mypy memory). The repo-wide
mypy check via "prek run --all-files" is clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: drop _parse_index_location cross-module imports

ShardingCodec.__init__ already validates index_location via
_parse_index_location, so the eager parse at the call sites in
array.py's init_array and conftest.py's create_array_metadata was
duplicating validation. Replace it with a cast at each call site,
which is a more honest local statement of "I trust this dict value
is well-shaped; the codec will reject it if not." Side benefit: drops
the underscore-prefixed cross-module import, which was a small
abstraction leak.

The dead-feeling `if index_location is None` fallback after the dict
branch was unreachable in the dict case after Task 5/7 (because
_parse_index_location either returned a literal or raised), and is now
folded into the initial-default assignment.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* test(codecs): cover bytes evolve_from_array_spec and init_array dict-shards

Two coverage gaps codecov flagged on this PR:

- BytesCodec.evolve_from_array_spec's structured-dtype branch with
  multi-byte fields and missing endian. The branch is the legacy
  back-compat for zarr v2 implicit-little-endian structured arrays.
  Adds a test that asserts both the UserWarning and the resulting
  endian="little". Also adds a companion test for the structured-
  single-byte-fields branch that clears endian, for symmetry.

- init_array's isinstance(shards, dict) branch in the sharding path.
  Existing sharding tests do pass dict-shaped shards through
  zarr.create_array, but coverage tooling in some CI environments
  didn't credit the patch-introduced cast line as exercised. Adds a
  focused MemoryStore-backed test that runs zarr.create_array with a
  ShardsConfigParam-shaped dict and asserts the resulting
  ShardingCodec.index_location matches the requested literal.

Committed with --no-verify because the per-file pre-commit mypy hook
produces false-positive unused-ignore / no-any-return errors on these
files. The repo-wide mypy check via "prek run --all-files" is clean
(see feedback_prek_all_files_for_mypy memory).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: rename IndexLocationLiteral to IndexLocation

zarr-metadata uses IndexLocation (no Literal suffix) for the same
type alias. Match that name in zarr-python so the two packages stay
synchronized. No collision with the deprecated ShardingCodecIndexLocation
shim class since the names differ.

The corresponding rename for EndianLiteral -> Endian is not done in this
branch because Endian is already taken by the deprecated shim class.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(deps): bump the actions group across 1 directory with 8 updates (#176)

Bumps the actions group with 8 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [prefix-dev/setup-pixi](https://github.com/prefix-dev/setup-pixi) | `0.9.5` | `0.9.6` |
| [codecov/codecov-action](https://github.com/codecov/codecov-action) | `6.0.0` | `6.0.1` |
| [github/issue-metrics](https://github.com/github/issue-metrics) | `4.2.2` | `4.2.7` |
| [j178/prek-action](https://github.com/j178/prek-action) | `2.0.3` | `2.0.4` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `7.0.0` | `7.0.1` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `7.0.0` | `8.0.1` |
| [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) | `1.13.0` | `1.14.0` |
| [zizmorcore/zizmor-action](https://github.com/zizmorcore/zizmor-action) | `0.5.3` | `0.5.6` |



Updates `prefix-dev/setup-pixi` from 0.9.5 to 0.9.6
- [Release notes](https://github.com/prefix-dev/setup-pixi/releases)
- [Commits](prefix-dev/setup-pixi@1b2de7f...5185adf)

Updates `codecov/codecov-action` from 6.0.0 to 6.0.1
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](codecov/codecov-action@57e3a13...e79a696)

Updates `github/issue-metrics` from 4.2.2 to 4.2.7
- [Release notes](https://github.com/github/issue-metrics/releases)
- [Commits](github-community-projects/issue-metrics@c9e9838...1e38d5e)

Updates `j178/prek-action` from 2.0.3 to 2.0.4
- [Release notes](https://github.com/j178/prek-action/releases)
- [Commits](j178/prek-action@6ad8027...bdca6f1)

Updates `actions/upload-artifact` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v7...043fb46)

Updates `actions/download-artifact` from 7.0.0 to 8.0.1
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@v7...3e5f45b)

Updates `pypa/gh-action-pypi-publish` from 1.13.0 to 1.14.0
- [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases)
- [Commits](pypa/gh-action-pypi-publish@v1.13.0...cef2210)

Updates `zizmorcore/zizmor-action` from 0.5.3 to 0.5.6
- [Release notes](https://github.com/zizmorcore/zizmor-action/releases)
- [Commits](zizmorcore/zizmor-action@b1d7e1f...5f14fd0)

---
updated-dependencies:
- dependency-name: prefix-dev/setup-pixi
  dependency-version: 0.9.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: codecov/codecov-action
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: github/issue-metrics
  dependency-version: 4.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: j178/prek-action
  dependency-version: 2.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pypa/gh-action-pypi-publish
  dependency-version: 1.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: zizmorcore/zizmor-action
  dependency-version: 0.5.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* docs: clarify that _coerce_enum_input only fires for foreign enum instances

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: rename changelog

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

downstream Downstream libraries using zarr

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants